A large number of the digital systems being designed today are task-specific systems that consist of standard or custom hardware and standard or custom software.
Some systems have a predominately software element; in that most of the design effort is spent implementing the system in software. Typically, this software is implemented on standard or previously designed hardware.
Other systems are hardware dominant; in that most of the design effort is spent implementing the system in programmable logic devices (PLDs) or application specific integrated circuits (ASICs).
In either case where hardware or software dominates, there are a variety of tools that can be used by the designer to validate the system and ensure that it is operating correctly. In the case of a software dominant system, debugger and other related software tools could be used. In the case of a hardware dominant system, hardware emulation or simulation could be used.
The systems that are the most difficult to validate are those that are neither hardware nor software dominant, where both parts play an important role in the success of the system. Often, the hardware and software are initially developed separately with each part being tested independently of the other. The hardware is tested using a hardware simulator or emulator. The software is validated using an instruction set simulator on a computer. Typically, an instruction set simulator will run at speeds that are several orders of magnitude higher than in a hardware simulator.
Once both the hardware and software have been verified separately, the two are co-simulated. That is, a simulation is carried out where the software runs on a simulation of the prototype hardware.
Due to the much lower speed of hardware simulation, this co-simulation is considerably slower than instruction set simulation.